#include "sqstack.h"

/*
InitStack:初始化一个空栈,分配一个栈
返回值:返回一个初始化好的栈的地址
*/
Sqstack *InitStack()
{
    //仅仅分配空间
    Sqstack *s = (Sqstack *)malloc(sizeof(Sqstack));
    //初始化
    s->data = (Datatype *)malloc(sizeof(Datatype)*MAX_NUM);
    s->top = -1;
    return s;
}

/*
DestoryStack:销毁一个栈
@s:指向你要销毁的栈
返回值:无
*/
void DestoryStack(Sqstack *s)
{
    if(s == NULL)
    {
        return;
    }
    free(s->data);
    free(s);
}

/*
ClearStack:清空一个栈
@s:指向你要销毁的栈
返回值:无
*/
void ClearStack(Sqstack *s)
{
    if(s == NULL)
    {
        return;
    }
    s->top = -1;//top = -1相当于初始化    
}

/*
StackIsEmpty:判断栈是否为空(是否存在用户数据)
@s:指向你要操作的栈
返回值:
    如果栈为空,返回真  true 
    如果栈为非空,返回假  false
*/
bool StackIsEmpty(Sqstack *s)
{
    return s->top ==-1 || s ==NULL;
}

/*
StackSize:获取栈的大小(用户元素的个数)
@s:指向你要操作的栈
返回值:栈中的元素个数
*/
int StackSize(Sqstack *s)
{
    if(s == NULL)
    {
        return 0;
    }
    return s->top +1;
}

/*
GetTop:获取栈顶元素,但是不出栈
@s:指向你要操作的栈
@v:指向一个可用的空间,用来保存获取到的栈顶元素
返回值:表示获取成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool GetTop(Sqstack *s,Datatype *v)
{
    if(s == NULL || StackIsEmpty(s))
    {
        return false;
    }
    *v = s->data[s->top];//不清楚
    return true;
}

/*
Push:入栈,把一个用户数据存放到栈中去
@s:指向你要操作的栈
@e:你要入栈的元素
返回值:表示入栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Push(Sqstack *s,Datatype e)
{
    if(s == NULL || s->top+1 == MAX_NUM)
    {
        return false;   //入栈失败
    }
    s->top ++;
    s->data[s->top] = e;
    return true;
}

/*
Pop:出栈,把一个用户数据从栈中拿出来
@s:指向你要操作的栈
返回值:表示出栈成功或者失败
    返回 true  表示成功
    返回 false 表示失败
*/
bool Pop(Sqstack *s)
{
    if(s == NULL || StackIsEmpty(s))
    {
        return false;
    }
    s->top--;
    return true;
}